package io.github.echarts.model;

import io.github.echarts.model.component.Component;
import io.github.echarts.model.coordinate.CoordinateSystem;
import io.github.echarts.model.coordinate.CoordinateSystemManager;
import io.github.echarts.model.coordinate.DataRange;
import io.github.echarts.model.geometry.Rectangle;
import io.github.echarts.model.layout.LayoutManager;
import io.github.echarts.model.series.SeriesDataManager;
import io.github.echarts.model.theme.DefaultTheme;
import io.github.echarts.model.theme.Theme;
import io.github.echarts.model.theme.ThemeManager;
import io.github.echarts.option.EChartOption;
import io.github.echarts.option.component.Grid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 核心模型类，处理EChartsOption配置，
 * 并准备渲染所需的数据和环境。
 * 该类专注于数据管理，不涉及渲染和布局计算。
 */
public class ChartModel {
    
    // 基础属性
    private int width;
    private int height;
    private String backgroundColor;
    private boolean containBorder;
    private String borderColor;
    
    // 坐标系相关属性
    private CoordinateSystemManager coordinateSystemManager;
    
    // 数据处理相关属性
    private SeriesDataManager seriesDataManager;
    private CategoryManager categoryManager;
    private Map<String, DataRange> dataRanges;
    
    // 组件相关属性
    private List<Component> components;
    
    // 布局管理器
    private LayoutManager layoutManager;
    
    // 网格区域
    private Rectangle gridArea;
    
    // 主题
    private Theme theme;
    
    /**
     * 创建一个新的图表模型，指定尺寸。
     * 
     * @param width 图表宽度（像素）
     * @param height 图表高度（像素）
     */
    public ChartModel(int width, int height) {
        this.width = width;
        this.height = height;
        this.coordinateSystemManager = new CoordinateSystemManager();
        this.dataRanges = new HashMap<>();
        this.components = new ArrayList<>();
        this.layoutManager = new LayoutManager(width, height);
        this.theme = ThemeManager.getInstance().getCurrentTheme();
    }
    
    /**
     * 获取图表宽度。
     * 
     * @return 宽度（像素）
     */
    public int getWidth() {
        return width;
    }
    
    /**
     * 获取图表高度。
     * 
     * @return 高度（像素）
     */
    public int getHeight() {
        return height;
    }
    
    /**
     * 获取背景颜色
     * 
     * @return 背景颜色
     */
    public String getBackgroundColor() {
        // 从主题获取背景颜色
        if (theme != null) {
            return theme.getBackgroundColor();
        }
        
        // 如果设置了自定义背景色，优先使用
        if (backgroundColor != null && !backgroundColor.isEmpty()) {
            return backgroundColor;
        }
        
        // 默认背景颜色
        return "#ffffff";
    }
    
    /**
     * 设置背景颜色
     * 
     * @param backgroundColor 背景颜色
     */
    public void setBackgroundColor(String backgroundColor) {
        this.backgroundColor = backgroundColor;
    }
    
    /**
     * 获取是否包含边框
     * 
     * @return 是否包含边框
     */
    public boolean isContainBorder() {
        return containBorder;
    }
    
    /**
     * 设置是否包含边框
     * 
     * @param containBorder 是否包含边框
     */
    public void setContainBorder(boolean containBorder) {
        this.containBorder = containBorder;
    }
    
    /**
     * 获取边框颜色
     * 
     * @return 边框颜色
     */
    public String getBorderColor() {
        return borderColor;
    }
    
    /**
     * 设置边框颜色
     * 
     * @param borderColor 边框颜色
     */
    public void setBorderColor(String borderColor) {
        this.borderColor = borderColor;
    }
    
    /**
     * 获取主坐标系
     * 
     * @return 主坐标系
     */
    public CoordinateSystem getMainCoordinateSystem() {
        return coordinateSystemManager.getMainCoordinateSystem();
    }
    
    /**
     * 设置主坐标系
     * 
     * @param mainCoordinateSystem 主坐标系
     */
    public void setMainCoordinateSystem(CoordinateSystem mainCoordinateSystem) {
        coordinateSystemManager.setMainCoordinateSystem(mainCoordinateSystem);
    }
    
    /**
     * 获取所有坐标系
     * 
     * @return 坐标系集合
     */
    public List<CoordinateSystem> getCoordinateSystems() {
        return coordinateSystemManager.getAllCoordinateSystems();
    }
    
    /**
     * 添加坐标系
     * 
     * @param id 坐标系ID
     * @param coordinateSystem 坐标系实例
     */
    public void addCoordinateSystem(String id, CoordinateSystem coordinateSystem) {
        coordinateSystemManager.addCoordinateSystem(id, coordinateSystem);
    }
    
    /**
     * 获取坐标系管理器
     * 
     * @return 坐标系管理器
     */
    public CoordinateSystemManager getCoordinateSystemManager() {
        return coordinateSystemManager;
    }
    
    /**
     * 获取系列数据管理器
     * 
     * @return 系列数据管理器
     */
    public SeriesDataManager getSeriesDataManager() {
        return seriesDataManager;
    }
    
    /**
     * 设置系列数据管理器
     * 
     * @param seriesDataManager 系列数据管理器
     */
    public void setSeriesDataManager(SeriesDataManager seriesDataManager) {
        this.seriesDataManager = seriesDataManager;
    }
    
    /**
     * 获取所有组件
     * 
     * @return 组件列表
     */
    public List<Component> getComponents() {
        return components;
    }
    
    /**
     * 添加组件
     * 
     * @param component 组件
     */
    public void addComponent(Component component) {
        components.add(component);
    }
    
    /**
     * 获取布局管理器
     * 
     * @return 布局管理器
     */
    public LayoutManager getLayoutManager() {
        return layoutManager;
    }
    
    /**
     * 设置布局管理器
     * 
     * @param layoutManager 布局管理器
     */
    public void setLayoutManager(LayoutManager layoutManager) {
        this.layoutManager = layoutManager;
    }
    
    /**
     * 获取网格区域
     * 
     * @return 网格区域
     */
    public Rectangle getGridArea() {
        return gridArea;
    }
    
    /**
     * 设置网格区域
     * 
     * @param gridArea 网格区域
     */
    public void setGridArea(Rectangle gridArea) {
        this.gridArea = gridArea;
        
        // 更新坐标系区域
        if (coordinateSystemManager != null && gridArea != null) {
            // 确保有默认坐标系并设置其区域
            String defaultId = coordinateSystemManager.ensureDefaultCoordinateSystem(gridArea);
            
            // 更新主坐标系区域
            CoordinateSystem mainCoordinateSystem = coordinateSystemManager.getMainCoordinateSystem();
            if (mainCoordinateSystem != null) {
                mainCoordinateSystem.setLayoutArea(gridArea);
            }
        }
    }
    
    /**
     * 获取类别管理器
     * 
     * @return 类别管理器
     */
    public CategoryManager getCategoryManager() {
        return categoryManager;
    }
    
    /**
     * 设置类别管理器
     * 
     * @param categoryManager 类别管理器
     */
    public void setCategoryManager(CategoryManager categoryManager) {
        this.categoryManager = categoryManager;
    }
    
    /**
     * 获取当前使用的主题
     * 
     * @return 主题对象
     */
    public Theme getTheme() {
        return theme;
    }
    
    /**
     * 设置主题
     * 
     * @param theme 要使用的主题
     */
    public void setTheme(Theme theme) {
        this.theme = theme;
    }
    
    /**
     * 根据主题名称设置主题
     * 
     * @param themeName 主题名称
     */
    public void setThemeByName(String themeName) {
        Theme newTheme = ThemeManager.getInstance().getTheme(themeName);
        if (newTheme != null) {
            this.theme = newTheme;
        }
    }
    
    /**
     * 计算布局
     * 该方法已弃用，请使用LayoutManager.calculatePreliminaryLayout和refineLayout代替
     */
    @Deprecated
    public void calculateLayout() {
        // 调用布局管理器进行布局计算
        layoutManager.calculatePreliminaryLayout(this);
        
        // 注意：旧的布局逻辑已移至布局管理器，这里保留方法是为了向后兼容
    }
    
    /**
     * 获取指定ID的坐标系，如果不存在则返回默认坐标系
     * 
     * @param id 坐标系ID
     * @return 坐标系实例，保证不为null
     */
    public CoordinateSystem getCoordinateSystemById(String id) {
        return coordinateSystemManager.getCoordinateSystem(id);
    }
} 